package ar.edu.uade.centroDistribucion.sessionBeans;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import tienda14.TiendaServiceBeanServiceLocator;
import tienda9.ZaraTiendaFacadeServiceLocator;
import webServices.SolFabrServer;
import webServices.SolFabrServerServiceLocator;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

import ar.edu.uade.centroDistribucion.entities.EnvioATienda;
import ar.edu.uade.centroDistribucion.entities.Fabrica;
import ar.edu.uade.centroDistribucion.facade.FacadeCentroDistribucion;
import ar.edu.uade.centroDistribucion.sessionBeans.administradorIntegracion;
import ar.edu.uade.centroDistribucion.valueObjects.ArticuloVO;
import ar.edu.uade.centroDistribucion.valueObjects.CentrosDistribucionVO;
import ar.edu.uade.centroDistribucion.valueObjects.EnvTVO;
import ar.edu.uade.centroDistribucion.valueObjects.NuevoArticuloVO;
import ar.edu.uade.centroDistribucion.valueObjects.RepAFVO;
import ar.edu.uade.centroDistribucion.valueObjects.SolDistVO;
import ar.edu.uade.centroDistribucion.valueObjects.SolFabrVO;
import ar.edu.uade.centroDistribucion.valueObjects.TiendaVO;
@Stateless
public  class administradorIntegracionBean implements administradorIntegracion {
	
	@PersistenceContext(unitName="CentroDistribucionTortuguitas")
	private EntityManager manager;
	
	@EJB
	private administradorArticulo adminArticulo;
	@EJB
	private administradorEnvioATienda adminEnvioTienda;
	@EJB
	private administradorReposicionFabrica adminReposicionFabrica;
	@EJB
	private administradorSolicitudDistribucion adminSolicitudDistribucion;
	@EJB
	private administradorSolicitudFabricacion adminSolicitudFabricacion;
	
	public void ProcesarEnvioNuevoArticulo(String xml)
	{
		XStream xStream = new XStream(new DomDriver());		 
		NuevoArticuloVO nuevoArt = null;
		xStream.alias("NuevoArt",NuevoArticuloVO.class);
		xStream.alias("CentroDistribucion",CentrosDistribucionVO.class);
		
		try {
			//Obtengo el Value Object desde el XML
			nuevoArt = (NuevoArticuloVO)xStream.fromXML(xml);
			adminArticulo.ProcesarArticuloNuevo(nuevoArt);
			System.out.println("Nuevo Articulo OK");
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e.getMessage() + e.getStackTrace().toString());
		}
		
	}
	public String ProcesarEnvioSolicitudDistribucion(String xml)
	{
		XStream xStream = new XStream(new DomDriver());
		SolDistVO solDist = null;
		xStream.alias("SolDist",SolDistVO.class);
		xStream.alias("Tienda",TiendaVO.class);
		xStream.alias("Articulo",ArticuloVO.class);
		
		try {
			//Obtengo el Value Object desde el XML
			solDist = (SolDistVO)xStream.fromXML(xml);
			adminSolicitudDistribucion.Distribuir(solDist);
			System.out.println("SolicitudDistribucion OK");
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e.getMessage() + e.getStackTrace().toString());
			return e.getMessage();
		}
		return "";
	}
	public String ProcesarEnvioReposicionFabrica(String xml)
	{
		XStream xStream = new XStream(new DomDriver());
		RepAFVO repAF = null;
		xStream.alias("RepAF",RepAFVO.class);
		xStream.alias("Articulo",ArticuloVO.class);
		
		try {
			//Obtengo el Value Object desde el XML
			repAF = (RepAFVO)xStream.fromXML(xml);
			adminReposicionFabrica.ReponerArticulos(repAF);
			System.out.println("Reposicion OK");
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("Error en la reposicion " + e.getMessage());
			return e.getMessage();
		}
		return "";
	}
	
	public void GenerarEnvioATienda(EnvTVO envTVO,int tiendaId)
	{
		//Este metodo ademas tiene que tener la logica para saber a que tienda y a que ip mandar
		String strXML ="";
		String respuesta="";
		try {
			XStream xStream = new XStream();
			xStream.alias("EnvT", EnvTVO.class);
			xStream.alias("Articulo", ArticuloVO.class);		
			strXML = xStream.toXML(envTVO);
			
			System.out.println("Tienda: " + tiendaId);
			Query q = manager.createQuery("SELECT e FROM EnvioATienda e WHERE e.id = " + tiendaId);
			EnvioATienda envt = (EnvioATienda)q.getSingleResult(); 
			//Enviar por WS el EnvT
			switch (envt.getTienda().getId()) {
			case 1:
				tienda1.EnvTWSServiceLocator locator1 = new tienda1.EnvTWSServiceLocator();
				tienda1.EnvTWS port1 = locator1.getEnvTWSPort();
				respuesta = port1.procesarEnvt(strXML);
				if ((respuesta!= null) && (respuesta.equals(""))) {
					System.out.println("Error de recepcion ENVT " + respuesta);	
				} 
				else {
					System.out.println("ENVT enviada OK");
				}
				break;
			case 9:
				tienda9.ZaraTiendaFacadeServiceLocator locator9 = new ZaraTiendaFacadeServiceLocator();
				tienda9.ZaraTiendaFacade port9 = locator9.getZaraTiendaFacadePort();
				respuesta = port9.procesarEnvT(strXML);
				if ((respuesta!= null) && (respuesta.equals(""))) {
					System.out.println("Error de recepcion ENVT " + respuesta);	
				}
				else {
					System.out.println("ENVT enviada OK");
				}
				break;
			case 14:
				tienda14.TiendaServiceBeanServiceLocator locator14 = new TiendaServiceBeanServiceLocator();
				tienda14.TiendaServiceBean port14 = locator14.getTiendaServiceBeanPort();
				respuesta= port14.procesarEnvT(strXML);
				if ((respuesta!= null) && (respuesta.equals(""))) {
					System.out.println("Error de recepcion ENVT " + respuesta);	
				}
				else {
					System.out.println("ENVT enviada OK");
				}
			default:
				break;
			}
			
			
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("Error al enviar ENVT "+e.getMessage() + e.toString());
		}
		
		
	}
	
	public void GenerarSolicitudFabricacion(SolFabrVO solFabrVO)
	{
		String strXML = "";
		String respuesta = "";
		
		Query q = manager.createQuery("SELECT f FROM Fabrica f where id = 1");
		
		try {
				XStream xStream = new XStream();
				xStream.alias("SolFabr", SolFabrVO.class);
				xStream.alias("Articulo", ArticuloVO.class);
				strXML = xStream.toXML(solFabrVO);
				System.out.println("SolFab generada.");
				
				Fabrica fabrica = (Fabrica)q.getSingleResult();
				
				//Enviar la solfab por WS
				webServices.SolFabrServerServiceLocator locator = new SolFabrServerServiceLocator();				
				locator.setSolFabrServerPortEndpointAddress(fabrica.getAddres());
				
				SolFabrServer port= locator.getSolFabrServerPort();
				respuesta = port.procesarSolFabr(strXML);
				if ((respuesta!= null) && (respuesta.equals(""))) {
					System.out.println("Error al enviar SolFab");	
				}
				else {
					System.out.println("SolFab enviada OK");
				}
				
			}catch (Exception e) {
				System.out.println(e.getMessage() + e.toString());
			}	
			
			
	}
	

}
